<?php
/**
 * AddUserForm.php
 * @author Winbeek <winbeek@gmail.com>
 * @since 21 July 2012
 * @version $Id: AddUserForm.php 26 2012-07-28 17:47:11Z winbeek $
 */

use Nette\Application\UI\Form,
	Nette\Utils\Strings;

class AddUserForm extends Nette\Application\UI\Control {
	/** @var Nette\Database\Table\Selection $users */
	private $users;

	/** @var array $names */
	private $names;

	/**
	 * @param Nette\Database\Table\Selection $users
	 */
	public function __construct(Nette\Database\Table\Selection $users)
	{
		$this->users = clone $users;
		$this->names = $users->fetchPairs('id', 'username');
	}

	public function render()
	{
		$this->template->setFile(__DIR__ . '/AddUserForm.latte');
		$this->template->render();
	}

	protected function createComponentForm()
	{
		$form = new Form;

		$form->addText('username', 'Přihlašovací jméno:')
			->addRule(Form::FILLED, 'Je nutné zadat přihlašovací jméno')
			->addRule(Form::MIN_LENGTH, 'Minimální délka jsou 4 znaky', 4)
			->addRule(Form::MAX_LENGTH, 'Maximální délka je 16 znaků', 16)
			->addRule(Form::PATTERN, 'Přihlašovací jméno může obsahovat pouze malá písmena bez diakritiky.', '[a-z]*')
			->addRule(~Form::IS_IN, 'Zadané jméno již existuje!', $this->names);
		$form->addText('password', 'Heslo:')
			->setDefaultValue(Strings::random(6, '0-9'))
			->addRule(Form::FILLED, 'Je nutné zadat heslo!')
			->addRule(Form::MIN_LENGTH, 'Minimální délka jsou 4 znaky', 4);
		$form->addText('repassword', 'Heslo znovu:')
			->addRule(Form::EQUAL, 'Hesla se neshodují!', $form['password']);

		$form->addSubmit('submit', 'Zaregistrovat');
		$form->onSuccess[] = callback($this, 'formSubmitted');
		return $form;
	}

	/**
	 * @param Nette\Application\UI\Form $form
	 */
	public function formSubmitted(Form $form)
	{
		if (!$this->presenter->user->isInRole('admin'))
			$this->presenter->redirect('this');

		$values = $form->values;

		$this->users->insert(array(
			'username' => Strings::lower(Strings::trim($values['username'])),
			'password' => $this->presenter->context->authenticator->calculateHash($values['password']),
		));

		$this->flashMessage('Uživatel úspěšně přidán!', 'success');
		$this->presenter->redirect('this');
	}
}